package com.bw.baserecyclerview.quick;

import android.text.TextUtils;
import android.util.SparseArray;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

/**
 * 自定义封装万能适配器下的viewholder:
 * 1.getView方法获取itemview;
 * 2.setText方法设置控件要显示的text值
 * 3.setVisiblity设置控件显示隐藏
 * 由于recyclerview缓存的为viewholder对象,viewholder持有itemview对象(显示到recyclerview中的一条)
 * itemView 具有若干个不固定数量的子控件进行展示
 * 容器集合存放已经完成findviewbyid的子控件对象->未查找的控件在使用前先查找在保存，在使用
 * */
public class BaseViewHolder extends RecyclerView.ViewHolder {

    private SparseArray<View>sparseArray=new SparseArray<>();//键值对类型键为int值为object 底层使用int以及object数组实现

    public BaseViewHolder(@NonNull View itemView) {
        super(itemView);
    }

    //查找控件方法->查找itemview下子控件
    //泛型方法->返回值为一个View子类
    private <V extends View> V find(int id){
        return itemView.findViewById(id);
    }

    //对外提供获取具体子控件方法
    public <V extends View>V getView(int id){
        V v;
        //获取当前holder下已经findviewbyid的子控件
        v = (V) sparseArray.get(id);
        if (v !=null)
            return v;
        //根据id查询子控件
        v = find(id);
        //findviewbyid查询到的子控件保存到sparseArray中下次直接使用
        if (v!=null)
            sparseArray.put(id,v);
        return v;
    }

    //设置要显示的字符串方法
    public void setText(int id,String content){
        if (TextUtils.isEmpty(content))
            return;
        TextView textView = getView(id);
        if (textView == null)
            return;
        textView.setText(content);
    }

    //设置控件显示隐藏
    public void setVisibility(int id,boolean visibilityFlag){
        View view = getView(id);
        if (view == null)
            return;
        view.setVisibility(visibilityFlag?View.VISIBLE:View.GONE);
    }

    //设置ImageView显示网络图片
    public void setImage(int id,String path){
        if (TextUtils.isEmpty(path))
            return;
        ImageView imageView = getView(id);
        if (imageView == null)
            return;
        //调用封装完成的glide加载网络图片
    }

}
